-- 字符串操作

--[[
    string.len(arg) ： 字符串长度

    string.upper(argument): 字符串全部转为大写字母。

    string.lower(argument): 字符串全部转为小写字母
    。
    string.gsub(mainString,findString,replaceString,num) : 字符串替换
        mainString 为要操作的字符串，
        findString 为被替换的字符，
        replaceString 要替换的字符，
        num 替换次数（可以忽略，则全部替换）

    string.find (str, substr, init, end) ： 在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置
    string.reverse(arg) ： 字符串反转

    string.format(...) ： 字符串格式化

    string.char(arg) ：  整型数字 转成 字符 并连接
    string.byte(arg[,int]) ： 转换字符为整数值 (可以指定某个字符，默认第一个字符)。
【注意】 此2个方法可处理，字符串与数字的互相转换

    string.match(str, pattern, init) ： 查找匹配正则表达式的字符串 ，从init 位置开始查找

    string.gmatch(str, pattern) ： 返回匹配的字符串的迭代器，返回的迭代器可用于遍历

    string.sub(s, i ,j) : 字符串截取

--]]
string.format("the value is:%d",4)
string.char(97,98,99,100)
string.byte("ABCD",4)
string.rep('abcd', 2) -- abcdabcd
string.match("I have 2 questions for you.", "%d+ %a+")

for word in string.gmatch("Hello Lua user", "%a+") do
    print(word)
end


-- 迭代器
--[[
    for 变量列表 in 迭代函数 , 状态变量 , 控制变量 do
        循环体
    end

    1>，初始化，计算 in 后面表达式的值，表达式应该返回泛型 for 需要的三个值：迭代函数、状态常量、控制变量；
    与多值赋值一样，如果表达式返回的结果个数不足三个会自动用 nil 补足，多出部分会被忽略。

    2>，将 状态常量 和 控制变量 作为迭代参数传递给 迭代函数（注意：对于 for 结构来说，状态常量没有用处，仅仅在初始化时获取他的值并传递给迭代函数）。
    3>，将 迭代函数返回的值 赋给变量列表。
    4>，如果返回的第一个值为nil循环结束，否则执行循环体。
    5>，回到第二步再次调用迭代函数
--]]

-- 分为无状态迭代器，有状态迭代器
--[[
    无状态迭代器 ：无状态的迭代器是指不保留任何状态的迭代器；
        每一次迭代，迭代函数都是用 状态常量、控制变量 这两个变量的值 作为迭代函数的参数被调用，
        一个无状态的迭代器只利用这两个值可以获取下一个元素。
    有状态迭代器 ：很多情况下，迭代器需要保存 多个状态信息，而不是简单的 状态常量和 控制变量，最简单的方法是使用闭包。
        还有一种方法就是将所有的状态信息封装到 table 内，将 table 作为迭代器的状态常量，
        因为这种情况下可以将所有的信息存放在 table 内，所以迭代函数通常不需要第二个参数。
--]]

-- lua 默认的迭代器（都是无状态迭代器）
--[[
    pairs(): 迭代table ,遍历table中的所有key,value
    ipairs() : 按照索引从 1 遍历 ，遇到 nil 值 就停止。
--]]


-- 自定义无状态迭代器
function square(MaxCount,currentNumber)
    if currentNumber<MaxCount then
        currentNumber = currentNumber+1
        return currentNumber, currentNumber*currentNumber
    end
end

for i,n in square,3,0 do
    print(i,n)
end


-- 自定义有状态迭代器
array = {"Google", "Runoob"}

function elementIterator (collection)
    local index = 0
    local count = #collection
    -- 闭包函数
    return function ()
        index = index + 1
        if index <= count then
            --  返回迭代器的当前元素
            return collection[index]
        end
    end
end

for element in elementIterator(array) do
    print(element)
end
